package org.graduation.recruitment.utils;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.Serializable;

/**
 * 统一返回结果类，用于封装接口返回的数据和状态。
 *
 * @param <T> 返回的数据类型
 */
public class ResponseResult<T> implements Serializable {
    private int code = 200; // 状态码，200表示成功
    private String msg = "成功"; // 描述信息，成功时为"成功"
    private T data; // 返回的数据

    // 默认构造函数
    public ResponseResult() {
    }

    /**
     * 构造一个成功的结果对象，并包含具体的数据。
     *
     * @param data 返回的数据
     * @param <T>  数据类型
     * @return 返回封装好的成功结果对象
     */
    public static <T> ResponseResult<T> success(T data) {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode(200);
        result.setMsg("成功");
        result.setData(data);
        return result;
    }

    /**
     * 构造一个成功的结果对象，不包含具体数据。
     *
     * @param <T> 数据类型
     * @return 返回封装好的成功结果对象
     */
    public static <T> ResponseResult<T> success() {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode(200);
        result.setMsg("成功");
        return result;
    }

    /**
     * 构造一个失败的结果对象，包含错误信息。
     *
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 返回封装好的失败结果对象
     */
    public static <T> ResponseResult<T> fail(String msg) {
        return fail(-1, msg);
    }

    /**
     * 构造一个失败的结果对象，包含状态码和错误信息。
     *
     * @param code 状态码
     * @param msg  错误信息
     * @param <T>  数据类型
     * @return 返回封装好的失败结果对象
     */
    public static <T> ResponseResult<T> fail(int code, String msg) {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    /**
     * 将结果对象序列化为JSON字符串。
     *
     * @return 返回序列化后的JSON字符串
     * @throws RuntimeException 如果序列化失败则抛出异常
     */
    public String toJson() {
        try {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.writeValueAsString(this);
        } catch (Exception e) {
            throw new RuntimeException("序列化失败", e);
        }
    }

    // Getter和Setter方法
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}